home *** CD-ROM | disk | FTP | other *** search
- Pynche - The PYthonically Natural Color and Hue Editor
-
- Contact: Barry A. Warsaw
- Email: bwarsaw@python.org
- Version: 0.1
-
- Introduction
-
- Pynche is a color editor based largely on a similar program that I
- originally wrote back in 1987 for the Sunview window system. That
- editor was called ICE, the Interactive Color Editor. I'd always
- wanted to port this program to X but didn't feel like hacking X
- and C code to do it. Fast forward many years, to where Python +
- Tkinter provides such a nice programming environment, with enough
- power, that I finally buckled down and re-implemented it. I
- changed the name because these days, too many other systems have
- the acronym `ICE'.
-
- Pynche has been tested with Python 1.5.1 using Tk 8.0. It
- probably works with Python 1.5. I've tested it on both Solaris
- 2.6 and Windows NT. There are some funky things that happen on
- Windows but I think they are primarily Tk problems. You'll want
- to be sure to have Tk 8.0.3 for Windows. Also, Pynche is very
- colormap intensive, so it doesn't work very well on 8-bit graphics
- cards. I'll probably fix that in the future.
-
- Pynche must find a text database of colors, in the X11 format.
- Pynche is distributed with an rgb.txt file from the X11R6.4
- distribution for this reason, but you can use a different file
- with the -d option. The file xlicense.txt contains the license
- only for rgb.txt and both files are in the X/ subdirectory.
-
- Pynche is pronounced `Pinch-ee'.
-
- Running Standalone
-
- On Unix, start it by running the `pynche' script. On Windows, run
- pynche.pyw to inhibit the console window. When run from the
- command line, the following options are recognized:
-
- --database file
- -d file
- Alternate location of the color database file. Without this
- option, the first of /usr/openwin/lib/rgb.txt or X/rgb.txt
- will be used.
-
- --initfile file
- -i file
- Alternate location of the persistent initialization file. See
- the section on Persistency below.
-
- --ignore
- -X
- Ignore the persistent initialization file when starting up.
- Pynche will still write the current option settings to the
- persistent init file when it quits.
-
- --help
- -h
- Print the help message.
-
- initialcolor
- a Tk color name or #rrggbb color spec to be used as the
- initially selected color. This overrides any color saved in
- the persistent init file. Since `#' needs to be escaped in
- many shells, it is optional in the spec (e.g. #45dd1f is the
- same as 45dd1f).
-
- Running as a Modal Dialog
-
- Pynche can be run as a modal dialog, inside another application.
- It supports the API implemented by the Tkinter standard
- tkColorChooser module, with a few changes. By importing
- pyColorChooser from the Pynche package, you can run
-
- pyColorChooser.askcolor()
-
- which will popup Pynche as a modal dialog, and return the selected
- color.
-
- There are some UI differences when running as a modal
- vs. standalone. When running as a modal, there is no "File" menu,
- but instead there are "Okay" and "Cancel" buttons.
-
- When "Okay" is hit, askcolor() returns the tuple
-
- ((r, g, b), "name")
-
- where r, g, and b are red, green, and blue color values
- respectively (in the range 0 to 255). "name" will be a color name
- from the color database if there is an exact match, otherwise it
- will be an X11 color spec of the form "#rrggbb". Note that this
- is different than tkColorChooser, which doesn't know anything
- about color names.
-
- askcolor() supports the following optional keyword arguments:
-
- color
- the color to set as the initial selected color
-
- master[*]
- the master window to use as the parent of the modal
- dialog. Without this argument, pyColorChooser will create
- it's own Tkinter.Tk instance as the master. This may not
- be what you want.
-
- databasefile[*]
- similar to the --database option, the value must be a
- file name
-
- initfile[*]
- similar to the --initfile option, the value must be a
- file name
-
- ignore[*]
- similar to the --ignore flag, the value is a boolean
-
- wantspec[*]
- When this is true, the "name" field in the return tuple
- will always be a color spec of the form "#rrggbb". It
- will not return a color name even if there is a match;
- this is so pyColorChooser can exactly match the API of
- tkColorChooser.
-
- [*] these arguments must be specified the first time
- askcolor() is used and cannot be changed on subsequent calls.
-
- The Colorstrip Window
-
- The top part of the main Pynche window contains the "variation
- strips". Each strip contains a number of "color chips". The
- strips always indicate the currently selected color by a highlight
- rectangle around the selected color chip, with an arrow pointing
- to the chip. Each arrow has an associated number giving you the
- color value along the variation's axis. Each variation strip
- shows you the colors that are reachable from the selected color by
- varying just one axis of the color solid.
-
- For example, when the selected color is (in Red/Green/Blue
- notation) 127/127/127, the Red Variations strip shows you every
- color in the range 0/127/127 to 255/127/127. Similarly for the
- green and blue axes. You can select any color by clicking on its
- chip. This will update the highlight rectangle and the arrow, as
- well as other displays in Pynche.
-
- Click on "Update while dragging" if you want Pynche to update the
- selected color while you drag along any variation strip (this will
- be slower). Click on "Hexadecimal" to display the arrow numbers
- in hex.
-
- The Proof Window
-
- In the lower left corner of the main window you see two larger
- color chips. The Selected chip shows you a larger version of the
- color selected in the variation strips, along with its X11 color
- specification. The Nearest chip shows you the closest color in
- the X11 database to the selected color, giving its X11 color name.
- Clicking on the Nearest color chip selects that color. Color
- distance is calculated in the 3D space of the RGB color solid and
- if more than one color name is the same distance from the selected
- color, the first one found will be chosen.
-
- Note that there may be more than one X11 color name for the same
- RGB value. In that case, the first one found in the text database
- is designated the "primary" name, and this is shown under the
- Nearest chip. The other names are "aliases" and they are visible
- in other Pynche windows.
-
- The Type-in Window
-
- At the lower right of the main window are three entry fields.
- Here you can type numeric values for any of the three color axes.
- Legal values are between 0 and 255, and these fields do not allow
- you to enter illegal values. You must hit Enter or Tab to select
- the new color.
-
- Click on "Update while typing" if you want Pynche to select the
- color on every keystroke (well, every one that produces a legal
- value!) Click on "Hexadecimal" to display and enter color values
- in hex.
-
- Other Views
-
- There are three secondary windows which are not displayed by
- default. You can bring these up via the "View" menu on the main
- Pynche window.
-
- The Text Window
-
- The "Text Window" allows you to see what effects various colors
- have on the standard Tk text widget elements. In the upper part
- of the window is a plain Tk text widget and here you can edit the
- text, select a region of text, etc. Below this is a button "Track
- color changes". When this is turned on, any colors selected in
- the other windows will change the text widget element specified in
- the radio buttons below. When this is turned off, text widget
- elements are not affected by color selection.
-
- You can choose which element gets changed by color selection by
- clicking on one of the radio buttons in the bottom part of this
- window. Text foreground and background affect the text in the
- upper part of the window. Selection foreground and background
- affect the colors of the primary selection which is what you see
- when you click the middle button (depending on window system) and
- drag it through some text.
-
- The Insertion is the insertion cursor in the text window, where
- new text will be inserted as you type. The insertion cursor only
- has a background.
-
- The Color List Window
-
- The "Color List" window shows every color in the text database
- (this window may take a while to come up). In the upper part of
- the window you see a scrolling list of all the color names in the
- database, in alphabetical order. Click on any color to select it.
- In the bottom part of the window is displayed any aliases for the
- selected color (those color names that have the same RGB value,
- but were found later in the text database). For example, find the
- color "Black" and you'll see that its aliases are "gray0" and
- "grey0".
-
- If the color has no aliases you'll see "<no aliases>" here. If you
- just want to see if a color has an alias, and do not want to select a
- color when you click on it, turn off "Update on Click".
-
- Note that the color list is always updated when a color is selected
- from the main window. There's no way to turn this feature off. If
- the selected color has no matching color name you'll see
- "<no matching color>" in the Aliases window.
-
- The Details Window
-
- The "Details" window gives you more control over color selection
- than just clicking on a color chip in the main window. The row of
- buttons along the top apply the specified increment and decrement
- amounts to the selected color. These delta amounts are applied to
- the variation strips specified by the check boxes labeled "Move
- Sliders". Thus if just Red and Green are selected, hitting -10
- will subtract 10 from the color value along the red and green
- variation only. Note the message under the checkboxes; this
- indicates the primary color level being changed when more than one
- slider is tied together. For example, if Red and Green are
- selected, you will be changing the Yellow level of the selected
- color.
-
- The "At Boundary" behavior determines what happens when any color
- variation hits either the lower or upper boundaries (0 or 255) as
- a result of clicking on the top row buttons:
-
- Stop
- When the increment or decrement would send any of the tied
- variations out of bounds, the entire delta is discarded.
-
- Wrap Around
- When the increment or decrement would send any of the tied
- variations out of bounds, the out of bounds value is wrapped
- around to the other side. Thus if red were at 238 and +25
- were clicked, red would have the value 7.
-
- Preseve Distance
- When the increment or decrement would send any of the tied
- variations out of bounds, all tied variations are wrapped as
- one, so as to preserve the distance between them. Thus if
- green and blue were tied, and green was at 238 while blue was
- at 223, and +25 were clicked, green would be at 15 and blue
- would be at 0.
-
- Squash
- When the increment or decrement would send any of the tied
- variations out of bounds, the out of bounds variation is set
- to the ceiling of 255 or floor of 0, as appropriate. In this
- way, all tied variations are squashed to one edge or the
- other.
-
- The top row buttons have the following keyboard accelerators:
-
- -25 == Shift Left Arrow
- -10 == Control Left Arrow
- -1 == Left Arrow
- +1 == Right Arrow
- +10 == Control Right Arrow
- +25 == Shift Right Arrow
-
- Keyboard Accelerators
-
- Alt-w in any secondary window dismisses the window. In the main
- window it exits Pynche (except when running as a modal).
-
- Alt-q in any window exits Pynche (except when running as a modal).
-
- Persistency
-
- Pynche remembers various settings of options and colors between
- invocations, storing these values in a `persistent initialization
- file'. The actual location of this file is specified by the
- --initfile option (see above), and defaults to ~/.pynche.
-
- When Pynche exits, it saves these values in the init file, and
- re-reads them when it starts up. There is no locking on this
- file, so if you run multiple instances of Pynche at a time, you
- will override the init file.
-
- The actual options stored include
-
- - the currently selected color
-
- - all settings of checkbox and radio button options in all windows
-
- - the contents of the text window, the current text selection and
- insertion point, and all current text widget element color
- settings.
-
- You can inhibit Pynche from reading the init file by supplying the
- --ignore option on the command line. However, you cannot suppress
- the storing of the settings in the init file on Pynche exit. If
- you really want to do this, use /dev/null as the init file, using
- --initfile.
-
- To Do
-
- Here's a brief list of things I want to do:
-
- - Better support for resizing the top level windows
-
- - Better support on 8-bit screens
-
- - More output views, e.g. color solids
-
- - Have the notion of a `last color selected'; this may require a
- new output view
-
- - Support setting the font in the text view
-
- I'm open to suggestions!
-
-
-
- Local Variables:
- indent-tabs-mode: nil
- End:
-